﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CANO.Data.DAOs;
using Newtonsoft.Json;

namespace CANO.WebSite.contacts
{
    public partial class editContact : System.Web.UI.Page
    {
        List<ContactoTelefonosDAO> newTelefonos = new List<ContactoTelefonosDAO>();
        List<AsignacionesDAO> asignacionesList = new List<AsignacionesDAO>();
        List<AsignacionesDAO> asignacionesToDeleteList = new List<AsignacionesDAO>();

        protected void Page_Load(object sender, EventArgs e)
        {


            if (!Page.IsPostBack)
            {
                //Set Session variables
                Session["ContactoTelefonosToAdd"] = newTelefonos;
                Session["AsignacionesToAdd"] = asignacionesList;
                Session["AsignacionesToDeleteList"] = asignacionesToDeleteList;
                Session["currentModule"] = "Contacts";

                //Fill Data
                this.fillDropDowns();

                //Fill Data Contact
                int currentContact = Convert.ToInt32(Request.QueryString["ContactID"]);
                if (currentContact == 0)
                {
                    pnlError.Visible = true;
                    pnlContactData.Visible = false;
                    return;
                }
                this.fillDataUser(currentContact);
            }
            //Bind Events buttons
            btnCrearContacto.Click += new EventHandler(btnCrearContacto_Click);
            btnAgregar.Click += new EventHandler(btnAgregar_Click);
            btnAddAsignacion.Click += new EventHandler(btnAddAsignacion_Click);
            rptAsignaciones.ItemCommand += new RepeaterCommandEventHandler(rptAsignaciones_ItemCommand);
            btnEliminar.Click += new EventHandler(btnEliminar_Click);

            newTelefonos = (List<ContactoTelefonosDAO>)Session["ContactoTelefonosToAdd"];
            asignacionesList = (List<AsignacionesDAO>)Session["AsignacionesToAdd"];
            asignacionesToDeleteList = (List<AsignacionesDAO>)Session["AsignacionesToDeleteList"];
        }


        void btnEliminar_Click(object sender, EventArgs e)
        {
            new ContactoDAO().Delete(Convert.ToInt32(Request.QueryString["ContactID"]));
            Response.Redirect("/contacts/contacts.aspx?Deleted=True");
        }

        void rptAsignaciones_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "delete")
            {
                AsignacionesDAO asignacionToDelete = new AsignacionesDAO();
                asignacionToDelete.Usuario = Convert.ToInt32(e.CommandArgument);
                asignacionToDelete.Contacto = Convert.ToInt32(Request.QueryString["ContactID"]);


                //asignacionesToDeleteList.Add(asignacionToDelete);

                asignacionToDelete.delete();
                ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "tmp", "<script type='text/javascript'>HideAsignacion(" + e.CommandArgument + ");</script>", false);
                //Response.Write("<script >jQuery('#asignacion" + e.CommandArgument + "').hide();</script>");
                return;
                //Session["AsignacionesToDeleteList"] = asignacionesToDeleteList;
            }
        }

        void btnAddAsignacion_Click(object sender, EventArgs e)
        {
            AsignacionesDAO nuevaAsignacion = new AsignacionesDAO();
            nuevaAsignacion.Usuario = Convert.ToInt32(ddlUser.SelectedValue);

            ddlUser.Items.Remove(ddlUser.SelectedItem);
            ddlUser.DataBind();

            asignacionesList.Add(nuevaAsignacion);

            Session["AsignacionesToAdd"] = asignacionesList;
        }

        void btnAgregar_Click(object sender, EventArgs e)
        {
            ContactoTelefonosDAO nuevoTelefono = new ContactoTelefonosDAO();
            nuevoTelefono.Telefono = txtNumero.Value;
            nuevoTelefono.TipoTelefonoID = Convert.ToInt32(ddlTipoTelefono.SelectedValue);

            newTelefonos.Add(nuevoTelefono);

            ddlTipoTelefono.Items.Remove(ddlTipoTelefono.SelectedItem);

            Session["ContactoTelefonosToAdd"] = newTelefonos;
        }

        void btnCrearContacto_Click(object sender, EventArgs e)
        {
            //Contact Properties
            ContactoDAO newContact = new ContactoDAO();
            newContact.ContactoID = Convert.ToInt32(Request.QueryString["ContactID"]);
            newContact.FechaOrigen = Convert.ToDateTime(txtFechaOrigen.Value);
            newContact.Apellido = txtApellido.Value;
            newContact.Nombre = txtNombre.Value;
            newContact.Email = txtEmailPrincipal.Value;
            if (ddlLugarInfluencia.SelectedIndex > 0)
                newContact.LugarInfluencia = Convert.ToInt32(ddlLugarInfluencia.SelectedValue);
            else
                newContact.LugarInfluencia = null;

            if (ddlTipoPropiedad.SelectedIndex > 0)
                newContact.TipoPropiedad = Convert.ToInt32(ddlTipoPropiedad.SelectedValue);
            else
                newContact.TipoPropiedad = null;


            if (ddlEspecialidad.SelectedIndex > 0)
                newContact.Especialidad = Convert.ToInt32(ddlEspecialidad.SelectedValue);
            else
                newContact.Especialidad = null;


            if (ddlNacionalidad.SelectedIndex > 0)
                newContact.Nacionalidad = Convert.ToInt32(ddlNacionalidad.SelectedValue);
            else
                newContact.Nacionalidad = null;

            if (rdbPropietarioSi.Checked)
                newContact.IsPropietario = 1;
            else
                newContact.IsPropietario = 0;


            newContact.DireccionPersonal = txtDireccionPersonal.Value;
            newContact.Dni = txtDNI.Value;
            newContact.EmailSecundario = txtEmailSecundario.Value;

            if (string.IsNullOrEmpty(txtFechaNacimiento.Value))
                newContact.FechaNacimiento = null;
            else
                newContact.FechaNacimiento = Convert.ToDateTime(txtFechaNacimiento.Value);

            newContact.DireccionLaboral = txtDireccionLaboral.Value;
            newContact.CuilCuit = txtCUITCUIL.Value;
            newContact.PaginaWeb = txtSitioWeb.Value;

            if (ddlProfesion.SelectedIndex == 0)
                newContact.Profesion = null;
            else
                newContact.Profesion = Convert.ToInt32(ddlProfesion.SelectedValue);

            newContact.Notas = txtNotas.Value;
            newContact.LastUpdate = DateTime.Now; //ToDO: SEGUNDOS?

            //Info Familiar
            //newContact.NombreConyuge = txtNombreConyuge.Value;
            //newContact.ContactoConyuge = txtContactoConyuge.Value;
            //newContact.NombreHijos = txtNombreHijos.Value;
            newContact.NombreConyuge = txtInfoFamiliar.Value;

            ContactoDAO.update(newContact);

            //Fix Celular

            Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(hiddenTelefonosToSave.Value);


            foreach (var telefono in values)
            {
                try
                {
                    ContactoTelefonosDAO contactoTelefono = new ContactoTelefonosDAO();
                    contactoTelefono.Contacto = newContact.ContactoID;
                    contactoTelefono.Telefono = telefono.Value;
                    contactoTelefono.TipoTelefonoID = Convert.ToInt32(telefono.Key);
                    contactoTelefono.update();

                }
                catch (Exception)
                {
                    ContactoTelefonosDAO contactoTelefono = new ContactoTelefonosDAO();
                    contactoTelefono.Contacto = newContact.ContactoID;
                    contactoTelefono.Telefono = telefono.Value;

                    switch (telefono.Key)
                    {
                        case "Celular":
                            contactoTelefono.TipoTelefonoID = 1;
                            break;
                        case "Celular Alternativo":
                            contactoTelefono.TipoTelefonoID = 2;
                            break;
                        case "Teléfono Particular":
                            contactoTelefono.TipoTelefonoID = 3;
                            break;
                        case "Teléfono Laboral":
                            contactoTelefono.TipoTelefonoID = 4;
                            break;
                        case "FAX":
                            contactoTelefono.TipoTelefonoID = 5;
                            break;
                        default:
                            break;
                    }
                    contactoTelefono.create();
                }

            }



            ////Set Telefonos
            //foreach (var telefono in newTelefonos)
            //{
            //    ContactoTelefonosDAO contactoTelefono = new ContactoTelefonosDAO();
            //    contactoTelefono.Contacto = newContact.ContactoID;
            //    contactoTelefono.Telefono = telefono.Telefono;
            //    contactoTelefono.TipoTelefonoID = telefono.TipoTelefonoID;
            //    contactoTelefono.create();
            //}
            //ToDo: Asignaciones
            foreach (var asignacion in asignacionesList)
            {
                AsignacionesDAO asignacionDAO = new AsignacionesDAO();
                asignacionDAO.Usuario = asignacion.Usuario;
                asignacionDAO.Contacto = newContact.ContactoID;
                asignacionDAO.create();
            }

            //foreach (var item in asignacionesToDeleteList)
            //{
            //    AsignacionesDAO asignacionDAO = new AsignacionesDAO();
            //    asignacionDAO.Usuario = item.Usuario;
            //    asignacionDAO.Contacto = newContact.ContactoID;
            //    asignacionDAO.delete();
            //}
            //ToDo: Observaciones
            List<ObservacionesDAO> listObservaciones = new List<ObservacionesDAO>();
            listObservaciones = (List<ObservacionesDAO>)Session["ObservacionesToAdd"];

            foreach (var observacion in listObservaciones)
            {
                ObservacionesDAO observacionDAO = new ObservacionesDAO();
                observacionDAO.Contacto = newContact.ContactoID;
                observacionDAO.FechaObservacion = observacion.FechaObservacion;
                observacionDAO.Observacion = observacion.Observacion;
                observacionDAO.UsuarioCreatedBy = observacion.UsuarioCreatedBy;
                observacionDAO.create();
            }
            //Send Notificaciones
            NotificationDAO notificacion = new NotificationDAO();

            notificacion.Mensaje = string.Format("Se actualizó el contacto {0} y se te autoasignó.",
                                newContact.Apellido + ", " + newContact.Nombre);
            //ToDo: Desasignar
            List<AsignacionesDAO> AsignacionesList = AsignacionesDAO.getAllByContactID(Convert.ToInt32(Request.QueryString["ContactID"]));

            foreach (var item in AsignacionesList)
            {
                notificacion.Insert(Convert.ToInt32(Session["CurrentUserID"]), item.Usuario);
            }

            Response.Redirect("/contacts/contact.aspx?ContactID=" + newContact.ContactoID.ToString());
        }

        private void fillDropDowns()
        {
            //Fill ddlLugarInfluencia
            ddlLugarInfluencia.DataSource = LugarInfluenciaDAO.getAll();
            ddlLugarInfluencia.DataValueField = "LugarInfluenciaID";
            ddlLugarInfluencia.DataTextField = "LugarInfluencia";
            ddlLugarInfluencia.DataBind();
            ddlLugarInfluencia.Items.Insert(0, "-- Seleccione un Lugar de Influencia --");

            //Fill ddlTipoPropiedad
            ddlTipoPropiedad.DataSource = TipoPropiedadDAO.getAll();
            ddlTipoPropiedad.DataValueField = "TipoPropiedadID";
            ddlTipoPropiedad.DataTextField = "TipoPropiedad";
            ddlTipoPropiedad.DataBind();
            ddlTipoPropiedad.Items.Insert(0, "-- Seleccione un Tipo de Propiedad --");

            //Fill ddlEspecialidad
            ddlEspecialidad.DataSource = EspecialidadDAO.getAll();
            ddlEspecialidad.DataValueField = "EspecialidadID";
            ddlEspecialidad.DataTextField = "Especialidad";
            ddlEspecialidad.DataBind();
            ddlEspecialidad.Items.Insert(0, "-- Seleccione una Especialidad --");

            //Fill TipoTelefono
            int currentContact = Convert.ToInt32(Request.QueryString["ContactID"]);
            ddlTipoTelefono.DataSource = TipoTelefonoDAO.getAll(currentContact);
            ddlTipoTelefono.DataValueField = "TipoTelefonoID";
            ddlTipoTelefono.DataTextField = "TipoTelefono";
            ddlTipoTelefono.DataBind();
            ddlTipoTelefono.Items.Insert(0, "-- Seleccione un Tipo de Telefono --");

            //Fill ddlUser para Asignaciones
            ddlUser.DataSource = UsuarioDAO.getAll();
            ddlUser.DataValueField = "UsuarioID";
            ddlUser.DataTextField = "fullName";
            ddlUser.DataBind();
            ddlUser.Items.Insert(0, "-- Seleccione un Usuario --");

            //Fill Nacionalidad
            ddlNacionalidad.DataSource = NacionalidadDAO.getAll();
            ddlNacionalidad.DataValueField = "NacionalidadID";
            ddlNacionalidad.DataTextField = "Nacionalidad";
            ddlNacionalidad.DataBind();
            ddlNacionalidad.Items.Insert(0, "-- Seleccione una Nacionalidad --");
            //ddlNacionalidad.SelectedValue = "1"; // ToDo: Validar, deberia ser siempre Argentina

            //Fill TipoProfesion
            ddlProfesion.DataSource = ProfesionDAO.getAll();
            ddlProfesion.DataValueField = "TipoProfesionID";
            ddlProfesion.DataTextField = "ProfesionDesc";
            ddlProfesion.DataBind();
            ddlProfesion.Items.Insert(0, "-- Seleccione una Profesión --");
        }

        private void fillDataUser(int contactID)
        {
            try
            {
                ContactoDAO contact = ContactoDAO.getContact(contactID.ToString());

                lblContactID.Text = contact.ContactoID.ToString();
                txtFechaOrigen.Value = contact.FechaOrigen.Value.ToShortDateString() + " " + contact.FechaOrigen.Value.ToShortTimeString();
                txtNombre.Value = contact.Nombre;
                txtApellido.Value = contact.Apellido;

                //Get Telefonos
                rptTelefonos.DataSource = ContactoTelefonosDAO.getAllByContactoID(contact.ContactoID);
                rptTelefonos.DataBind();

                txtEmailPrincipal.Value = contact.Email;
                ddlLugarInfluencia.SelectedValue = contact.LugarInfluencia.ToString();
                ddlTipoPropiedad.SelectedValue = contact.TipoPropiedad.ToString();
                ddlEspecialidad.SelectedValue = contact.Especialidad.ToString();
                ddlNacionalidad.SelectedValue = contact.Nacionalidad.ToString();

                if (contact.IsPropietario == 1)
                    rdbPropietarioSi.Checked = true;
                else
                    rdbPropietarioNo.Checked = true;

                //Get Observaciones
                rptObservaciones.DataSource = ObservacionesDAO.getObservacionesByContactID(contact.ContactoID);
                rptObservaciones.DataBind();
                if (ObservacionesDAO.getObservacionesByContactID(contact.ContactoID).Count == 0)
                    pnlNoObservaciones.Visible = true;

                //Get Asignaciones
                rptAsignaciones.DataSource = AsignacionesDAO.getAllByContactID(contact.ContactoID);
                rptAsignaciones.DataBind();
                //if (new UsuarioDAO().getUser(Convert.ToInt32(Session["CurrentUserID"])).Rol != 3)
                    AddAsignacion.Visible = true;

                //if (new UsuarioDAO().getUser(Convert.ToInt32(Session["CurrentUserID"])).Rol == 1)
                //    AddAsignacion.Visible = false;

                txtDireccionPersonal.Value = contact.DireccionPersonal;
                txtDNI.Value = contact.Dni;
                txtEmailSecundario.Value = contact.EmailSecundario;

                if (contact.FechaNacimiento.HasValue)
                    txtFechaNacimiento.Value = contact.FechaNacimiento.Value.ToShortDateString();
                else
                    txtFechaNacimiento.Value = contact.FechaNacimiento.ToString();

                txtCUITCUIL.Value = contact.CuilCuit;
                txtDireccionLaboral.Value = contact.DireccionLaboral;
                txtSitioWeb.Value = contact.PaginaWeb;
                ddlProfesion.SelectedValue = contact.Profesion.ToString();
                txtNotas.Value = contact.Notas;
                txtInfoFamiliar.Value = contact.NombreConyuge;
                //txtContactoConyuge.Value = contact.ContactoConyuge;
                //txtNombreConyuge.Value = contact.NombreConyuge;
                //txtNombreHijos.Value = contact.NombreHijos;


            }
            catch (Exception)
            {
                pnlError.Visible = true;
                pnlContactData.Visible = false;
            }
        }

    }
}